// Copyright (C) 2023 即时通讯网(52im.net) & Jack Jiang.
// The RainbowChat Project. All rights reserved.
// 
// 【本产品为著作权产品，合法授权后请放心使用，禁止外传！】
// 【本次授权给：<北京小羊驼科技有限公司>，授权编号：<NT231212144350>，代码指纹：<A.702363430.550>，技术对接人微信：<ID: wxid_wbyootvkdcgj22>】
// 【授权寄送：<收件：苏先生、地址：北京市大兴区北京密码西区6号楼1单元301、电话：18613885610、邮箱：bd@huiyuanxiang-inc.com>】
// 
// 【本系列产品在国家版权局的著作权登记信息如下】：
// 1）国家版权局登记名(简称)和权证号：RainbowChat    （证书号：软著登字第1220494号、登记号：2016SR041877）
// 2）国家版权局登记名(简称)和权证号：RainbowChat-Web（证书号：软著登字第3743440号、登记号：2019SR0322683）
// 3）国家版权局登记名(简称)和权证号：RainbowAV      （证书号：软著登字第2262004号、登记号：2017SR676720）
// 4）国家版权局登记名(简称)和权证号：MobileIMSDK-Web（证书号：软著登字第2262073号、登记号：2017SR676789）
// 5）国家版权局登记名(简称)和权证号：MobileIMSDK    （证书号：软著登字第1220581号、登记号：2016SR041964）
// * 著作权所有人：江顺/苏州网际时代信息科技有限公司
// 
// 【违法或违规使用投诉和举报方式】：
// 联系邮件：jack.jiang@52im.net
// 联系微信：hellojackjiang
// 联系QQ号：413980957
// 授权说明：http://www.52im.net/thread-1115-1-1.html
// 官方社区：http://www.52im.net
package com.x52im.rainbowchat;

import javax.servlet.ServletContextEvent;

import com.eva.framework.WebListener;
import com.eva.framework.dbpool.DBShell;
import com.x52im.rainbowchat.cache.GroupsInfoCacheProvider;
import com.x52im.rainbowchat.cache.GroupsMembersCacheProvider;
import com.x52im.rainbowchat.cache.UsersInfoCacheProvider;
import com.x52im.rainbowchat.http.file.TimmingRestoreImgAndVoice;
import com.x52im.rainbowchat.http.logic.TimmingRestoreMessages;
import com.x52im.rainbowchat.im.ChatServerLauncher;

/**
 * 本类是RainbowChat的服务端Java Web模块的Listener实现类。
 * <p>
 * 对于JavaEE规范来说，Listener类会在Tomcat等应用服务器启动后自动被调用，所以RainbowChat
 * 服务端中某些需要自动启动的服务、守护线程等放在本类中启动和关闭即可。
 * 
 * @author JackJiang
 * @since 1.0
 */
public class WebListenerEx extends WebListener
{
	/**
	 * The web module is ready to process requests.
	 * {@inheritDoc}
	 */
	public void contextInitialized(ServletContextEvent servletContextEvt)
	{
		super.contextInitialized(servletContextEvt);
		
		try
		{
			// 【重要】优先设置要连接的数据库类型（请根据您连接的DB类型正确地设置哦！）
//			DBShell.DB_TYPE = DBShell.DBType.sqlServer;
			DBShell.DB_TYPE = DBShell.DBType.mySql;
			
			// 启动定期转储过期图片、语音、短视频的处理线程
			TimmingRestoreImgAndVoice.getInstance().start();
			// 启动定期转储过期聊天记录、离线消息的处理线程
			TimmingRestoreMessages.getInstance().start();
			
			// 载入用户基本信息高速缓存数据（保证ios设备离线消息推送时的高性能）
			UsersInfoCacheProvider.DEBUG = false;
			UsersInfoCacheProvider.getInstance().init();
			// 载入群基本信息高速缓存数据（保证ios设备离线消息推送时的高性能）
			GroupsInfoCacheProvider.DEBUG = false;
			GroupsInfoCacheProvider.getInstance().init();
			// 载入群成员列表高速缓存数据（保证系统群聊时的高性能）
			GroupsMembersCacheProvider.DEBUG = false;
			GroupsMembersCacheProvider.getInstance().init();
			
			// 启动IM实例（放最后启动时机刚好）
			ChatServerLauncher.getInstance().startup();
		}
		catch (Exception e)
		{
			System.err.println("[HTTP]【N】聊天服务器启动时出错，原因是:"+e.getMessage());
			e.printStackTrace();
		}
	}

	/**
	 * The servlet context is about to be shut down.
	 * {@inheritDoc}
	 */
	public void contextDestroyed(ServletContextEvent servletContextEvt) 
	{
		super.contextDestroyed(servletContextEvt);
		
		try
		{
			// 关闭IM实例（优先关闭，时机刚好）
			ChatServerLauncher.getInstance().shutdown();
						
			// 清除缓存
			UsersInfoCacheProvider.getInstance().removeAll();
			// 清除缓存
			GroupsInfoCacheProvider.getInstance().removeAll();
			// 清除缓存
			GroupsMembersCacheProvider.getInstance().removeAll();
			
			// 关闭定期转储过期图片和语音的处理线程
			TimmingRestoreImgAndVoice.getInstance().stop();
			// 关闭定期转储过期聊天记录、离线消息的处理线程
			TimmingRestoreMessages.getInstance().stop();
		}
		catch (Exception e)
		{
			System.err.println("[HTTP]【N】聊天服务器关闭时出错，原因是:"+e.getMessage());
			e.printStackTrace();
		}
	}

}
